/*
 * Copyright (C) 2018 wxyz <hyhjwzx@126.com>
 * This program can be distributed under the terms of the GNU GPL Version 2.
 * See the file LICENSE.
 *
 */

package ren.wxyz.study.euler;

import ren.wxyz.study.euler.base.IProblem;
import ren.wxyz.study.euler.util.ConsoleHelper;

import java.util.Arrays;

/**
 * 欧拉计划 代码启动类
 *
 * 题目：https://projecteuler.net/archives
 *   翻译：http://pe-cn.github.io/problems/
 *
 * @auther wxyz 2018-02-28_17:03
 * @since 1.0
 */
public class App {
    public static void main(String[] args) {
        if (args.length < 1) {
            ConsoleHelper.error("未指定题目编号！");
            return;
        }
        int pNo;
        try {
            ConsoleHelper.print("题目编号：" + args[0]);
            ConsoleHelper.print("-------------");
            pNo = Integer.parseInt(args[0]);
        }
        catch (NumberFormatException e) {
            ConsoleHelper.error("题目编号格式错误，必须为数字！");
            return;
        }

        String className = getClassName(pNo);
        try {
            // 创建实例
            Object obj = Class.forName(className).newInstance();

            IProblem problem;
            if (obj instanceof IProblem) {
                problem = (IProblem) obj;

                // 传递参数
                String[] pargs = new String[0];
                if (args.length > 1) {
                    pargs = Arrays.copyOfRange(args, 1, args.length);
                }

                // 启动题目程序
                runProblem(problem, pargs);
            }
            else {
                ConsoleHelper.error("题目程序没有实现题目接口<IProblem>，题目类名：" + className);
            }
        }
        catch (ClassNotFoundException e) {
            ConsoleHelper.error("找不到题目执行程序，查询路径：" + className);
        }
        catch (InstantiationException | IllegalAccessException e) {
            ConsoleHelper.errorf("题目程序初始化失败，查询路径：%1$c，MSG：%2$c", className, e.getMessage());
        }
    }

    /**
     * 获取类全名
     *
     * @param pNo 题目编号
     * @return 类全名
     */
    static String getClassName(final int pNo) {
        if (pNo < 1) {
            return "";
        }
        int _no = (pNo - 1) / 10 + 1;

        return String.format("ren.wxyz.study.euler.hp%1$02d.P%2$03d", _no, pNo);
    }

    /**
     * 执行题目程序
     *
     * @param args 启动参数
     */
    static void runProblem(IProblem problem, String[] args) {
        long startTime = System.currentTimeMillis();

        try {
            problem.main(args);
        }
        catch (Throwable e) {
            e.printStackTrace();
        }

        long endTime = System.currentTimeMillis();
        ConsoleHelper.print("-------------");
        ConsoleHelper.printf("耗时：%1$.3f 秒", (endTime - startTime) / 1000.0f);
        ConsoleHelper.print();
    }
}
